信息流广告

简介

信息流广告分为自渲染广告和模板广告,但是模板广告只有当三方SDK支持时才会返回模板广告。SDK 提供信息流广告的数据绑定、点击事件的上报。

①自渲染广告:聚合SDK返回物料,由开发者在返回的CloooudMCanvasView类型的canvasView上进行子视图的自行渲染和展示。

②模板广告:聚合SDK直接返回渲染好的广告CloooudMCanvasView,开发者直接展示即可。

注意事项

①需要确保在SDK初始化成功后再进行广告请求,否则可能导致广告请求加载失败。

②聚合维度广告是通过广告位ID发起广告请求的,切记不要使用混淆。

③在广告接入前需要明确各ADN对应聚合广告样式情况,以确保正确完成广告接入,避免由于广告类型不匹配导致接入报错等情况的发生。

④广告加载数量以平台配置数量为准,本地数量仅在平台配置为0时有效,目前本地配置支持的广告数量为 1 ~ 3。

⑤由于各广告平台对于包名校验规则不同,需确保在穿山甲媒体平台填写的包名符合各adn平台规范,避免由于包名校验不匹配导致的无广告返回情况的产生。

⑥视频播放是否静音通过设置mutedIfCan接口即可,默认为NO,支持的ADN有admob/baidu/GDT/Mintergral/Sigmob;如若设置首次预加载功能,请检查静音接口设置是否与项目实际情况相符,默认为NO。

⑦一定要设置rootViewController,即跳转落地页需要的viewController。

⑧在物料加载成功方法里获取相关广告信息赋值后,需调用 registerContainer:withClickableViews:clickableViews注册绑定点击的View并刷新数据源refreshData:。

⑨每次获取物料信息后需要刷新调用refreshData:方法

接入信息流广告

// 创建广告对象
- (void)p_buildAd {
        CloooudAdSlot *slot1 = [[CloooudAdSlot alloc] init];
    CloooudSize *imgSize1 = [[CloooudSize alloc] init];
    imgSize1.width = 1080;
    imgSize1.height = 1920; // 按照实际情况设置宽高
    slot1.imgSize = imgSize1;

    slot1.ID = Cloooud_feed_ID; // 聚合维度通过广告位ID发起请求,

    // 聚合维度:如果是模板广告,返回高度将不一定是300,而是按照414和对应代码位在平台的配置计算出的高度
    slot1.adSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 400);

    slot1.mediation.mutedIfCan = YES; // 是否使用聚合功能

    self.adManager = [[CloooudNativeAdsManager alloc] initWithSlot:slot1];
    self.adManager.mediation.rootViewController = self;
    self.adManager.delegate = self;

}
// 触发广告加载
- (void)p_loadAdData {
    [self.adManager loadAdDataWithCount:3]; // 加载广告数量,支持设置1-3个
}
// 收到load成功回调后展示
# pragma mark ---<CloooudMNativeAdsManagerDelegate>---
- (void)nativeAdsManagerSuccessToLoad:(CloooudNativeAdsManager *)adsManager nativeAds:(NSArray<CloooudNativeAd *> *_Nullable)nativeAdDataArray{
  for (CloooudNativeAd *model in nativeAdDataArray) {
        NSUInteger index = rand() % (self.dataSource.count - 3) + 2;

        model.rootViewController = self;
        model.delegate = self;
        if (model.mediation.isExpressAd) {
            [model.mediation render];
        }
        [self.dataSource insertObject:model atIndex:index];
    }
    [self.tableView reloadData];
}

获取展示后广告信息示例

在收到加载成功回调后访问可获取到正确信息

- (void)logAdInfoAfterShow {
    CloooudMRitInfo *info = [self.adManager.mediation getShowEcpmInfo];
    // 展示后可获取信息如下
    NSLog(@"ecpm:%@", info.ecpm); // 单位:分
    NSLog(@"platform:%@", info.adnName);
    NSLog(@"ritID:%@", info.slotID);
    NSLog(@"requestID:%@", info.requestID ?: @"None");

    NSLog(@"getAdLoadInfoList:%@", [self.adManager.mediation getAdLoadInfoList]);
}

接口及回调说明

在SDK里只需要使用 CloooudNativeAdsManager 就可以获取信息流广告。CloooudNativeAdsManager支持多广告加载,可以一次加载返回多个广告,并且支持模版渲染和自渲染混出。

CloooudNativeAdsManager说明

方法 说明
@property (nonatomic, strong, nullable) CloooudAdSlot *adslot; 广告配置对象
@property (nonatomic, strong, nullable) NSArray<CloooudNativeAd > data;
@property (nonatomic, weak, nullable) id delegate; 信息流广告协议,聚合维度使用CloooudMNativeAdsManagerDelegate
@property (nonatomic, weak, nullable) id nativeExpressAdViewDelegate; 信息流广告视图协议
@property (nonatomic, assign, readwrite) CGSize adSize; 广告尺寸设置
- (void)loadAdDataWithCount:(NSInteger)count; 广告请求数量
@property (nonatomic, strong, nullable, readonly) CloooudNativeAdsManagerMediation *mediation; 当使用聚合广告位时,存在该属性,可获取聚合维度相关功能

CloooudNativeAdsManagerMediationProtocol说明

方法 说明
@property (nonatomic, weak) UIViewController *rootViewController; 必要,设置广告详情跳转控制器
- (void)destory;不再使用加载成功后回调的视图对象组时,可调用该方法释放占用的内存
@property (nonatomic, assign, readonly) BOOL isLoading; 广告是否加载中
- (void)addParam:(id)param withKey:(NSString *)key; 添加参数 param 参数值 key 参数key
- (NSArray<CloooudMAdLoadInfo > )getAdLoadInfoList; 一次waterfall中各adn代码位加载广告失败原因,建议调用时机:展示广告时/超时时/全部返回报错时;返回nil表示一次加载无代码位加载失败或其加载无响应

CloooudNativeAdsManagerDelegate说明

方法 说明
- (void)nativeAdsManagerSuccessToLoad:(CloooudNativeAdsManager )adsManager nativeAds:(NSArray<CloooudNativeAd > *_Nullable)nativeAdDataArray; 加载成功回调
- (void)nativeAdsManager:(CloooudNativeAdsManager )adsManager didFailWithError:(NSError _Nullable)error; 加载失败回调

CloooudNativeAd说明

将CloooudMCanvasView添加到父视图上进行展示。目前仅支持frame布局方式,不支持自动布局。 | 方法 | 说明 | | --- | --- | |@property (nonatomic, strong, readwrite, nullable) CloooudAdSlot adslot;|广告配置对象| |@property (atomic, strong, readonly, nullable) CloooudMaterialMeta data;|广告物料| |@property (nonatomic, weak, readwrite, nullable) id delegate;|CloooudNativeAdDelegate,聚合维度使用CloooudMNativeAdDelegate| |@property (nonatomic, weak, readwrite) UIViewController rootViewController;|必要 根视图控制器| |- (void)registerContainer:(__kindof UIView )containerView withClickableViews:(NSArray<__kindof UIView > _Nullable)clickableViews;|注册可点击视图 containerView:必要,原生广告的容器视图。 clickableViews:可选,可点击的视图数组。| |- (void)unregisterView;| 取消注册 聚合维度不支持此场景| |- (void)loadAdData;|加载广告| |- (NSString )getAdCreativeToken;|物料ID 聚合维度不支持| |@property (nonatomic, strong, nullable, readonly) CloooudNativeAdMediation mediation;当使用聚合广告位时,存在该属性,可获取聚合维度相关功能|

CloooudNativeAdMediationProtocol说明

方法 说明
@property (nonatomic, assign, readonly) BOOL isExpressAd; 是否是模板广告,由adapter开发者实现
@property (nonatomic, strong, readonly, nonnull)CloooudMCanvasView *canvasView; 如果是模板广告可直接将该视图添加到需要展示的位置,如果是非模板广告可对该视图内部控件进行布局操作
@property (nonatomic, strong, readonly) CloooudMVideoAdReporter *videoAdReporter; 自渲染视频类广告事件上报对象,仅采用自定义视频播放器时需要上报,部分ADN需申请白名单
- (void)render; 必要 渲染模板广告,开发者调用前无需区分是否为模板广告,Cloooud会自行处理
- (void)reSizeMediaView; 更新模板媒体视图大小
@property (nonatomic, assign, readonly) BOOL isReady; 是否已经准备广告展示,理论上在广告加载回调后即为YES,但受一些因素的影响(例如广告失效),可能为NO。建议在广告展示前调用该方法进行是否可以展示
- (nullable CloooudMRitInfo *)getShowEcpmInfo; 返回显示广告对应的披露信息
- (CloooudDictionary *_Nullable)extraData; 广告的扩展信息,可能为nil
- (NSArray<CloooudMRitInfo > )multiBiddingEcpmInfos; 填充后可调用,但推荐展示后调用,返回竞价广告的ecpm;当为server bidding ad时访问需要白名单权限;
- (NSArray<CloooudMRitInfo > )cacheRitList; 填充后可调用, 返回广告缓存池内所有信息;nil为无权限
- (CloooudMRitInfo *)getCurrentBestEcpmInfo; 填充后可调用,返回当前最佳广告的ecpm;当为server bidding ad时访问需要白名单权限
@property (nonatomic, copy, readonly) NSString *adViewID; 广告视图的唯一标识

CloooudMaterialMeta说明

自渲染广告物料信息 | 方法 | 说明 | | --- | --- | |@property (nonatomic, assign) CloooudInteractionType interactionType;|广告支持的交互类型| |@property (nonatomic, strong) NSArray<CloooudImage > imageAry;|图片| |@property (nonatomic, strong) CloooudImage icon;|广告logo| |@property (nonatomic, copy) NSString AdTitle;|广告标题| |@property (nonatomic, copy) NSString AdDescription;|广告描述| |@property (nonatomic, copy) NSString source;|广告源| |@property (nonatomic, copy) NSString buttonText;|创意按钮文本| |@property (nonatomic, assign) CloooudFeedADMode imageMode;|广告样式| |@property (nonatomic, assign) NSInteger score;|评分| |@property (nonatomic, assign) NSInteger commentNum;|评论数| |@property (nonatomic, assign) NSInteger appSize;|app大小| |@property (nonatomic, assign) NSInteger videoDuration;|视频时长| |@property (nonatomic, copy, readonly) NSString videoUrl;|视频url| |@property (nonatomic, assign, readonly) BOOL allowCustomVideoPlayer;|自定义播放器| |@property (nonatomic, copy) NSArray<CloooudDislikeWords > filterWords;|dislike原因| |@property (nonatomic, copy) NSDictionary mediaExt;|配置参数| |@property (nonatomic, copy) NSString ADXName;|adx名称| |@property (nonatomic, strong, nullable, readonly) CloooudMaterialMetaMediation *mediation;|使用聚合广告位时,存在该属性,可获取聚合维度相关功能|

CloooudMaterialMetaMediationProtocol说明

方法 说明
@property (nonatomic, strong, readonly, nullable) CloooudImage *adLogo; 广告adn的logo,如果logo有宽高,请尽量配置width和height
@property (nonatomic, assign, readonly) CGFloat videoAspectRatio; 视频纵横比(width/height),如果没有值或者异常返回0
@property (nonatomic, strong, readonly, nullable) NSString *appPrice; app购买价格,例如'免费',没有则为nil
@property (nonatomic, copy, readonly, nullable) NSString *advertiser; 广告商标识,广告商的名称或者链接
@property (copy, nonatomic, readonly, nullable) NSString *brandName; 品牌名称,若广告返回中无品牌名称则为空

CloooudMCanvasView说明

控件信息 | 方法 | 说明 | | --- | --- | |@property (nonatomic, strong, readonly, nullable) CloooudMaterialMeta data;|非模板Native广告的物料数据,模板广告时为nil| |@property (nonatomic, assign, readonly) BOOL hasSupportActionBtn;|是否支持自定义事件按钮,如果为YES,开发者可以配置 callToActionBtn 的UI数值,默认为YES| |@property (nonatomic, strong, readonly, nonnull) UILabel titleLabel;|广告标题,需要开发者根据广告物料自己指定展示内容| |@property (nonatomic, strong, readonly, nonnull) UILabel descLabel;|广告描述,需要开发者根据广告物料自己指定展示内容| |@property (nonatomic, strong, nullable) UIImageView iconImageView;|广告图标,可能不存在,需要开发者根据广告物料自己指定展示内容| |@property (nonatomic, strong, readonly, nonnull) UIImageView imageView;|广告大图,需要开发者根据广告物料自己指定展示内容,系统会自动创建,但内容需开发者自行校验| |@property (nonatomic, strong, readonly, nonnull) UIButton callToActionBtn;|广告详情/下载按钮,可能不存在,文案内容需要开发者根据广告物料自己获取| |@property (nonatomic, strong, nullable) UIView advertiserView;|广告商视图,可能不存在,开发者可自行赋值处理| |@property (nonatomic, strong, nullable) UIButton dislikeBtn;|广告关闭按钮,可能不存在,开发者需自行处理响应事件| |@property (nonatomic, strong, nullable) UIView adLogoView;|广告LOGO视图,可能不存在,需要开发者根据广告物料自己指定展示内容| |@property (nonatomic, strong, readonly, nullable) UIView mediaView;|媒体视图,即视频广告的视频图层,非视频广告不存在该视图| |- (void)registerClickableViews:(nullable NSArray<UIView > )views;|注册可点击区域,由Cloooud透传数据,是否生效由adapter 和 adn 决定 views 可响应点击操作的视图|

CloooudNativeAdDelegate说明

方法 说明
- (void)nativeAdDidLoad:(CloooudNativeAd *)nativeAd; 广告加载成功 聚合维度不支持此场景
- (void)nativeAdDidLoad:(CloooudNativeAd )nativeAd view:(UIView _Nullable)view; 广告加载成功 推荐使用该方法 聚合维度不支持此场景
- (void)nativeAd:(CloooudNativeAd )nativeAd didFailWithError:(NSError _Nullable)error; 广告加载失败
- (void)nativeAdDidBecomeVisible:(CloooudNativeAd *)nativeAd; 广告展示
- (void)nativeAdDidCloseOtherController:(CloooudNativeAd *)nativeAd interactionType:(CloooudInteractionType)interactionType; 此方法在另一个控制器关闭时调用。 interactionType:在app中打开appstore或打开网页或查看视频广告详情页面。
- (void)nativeAdDidClick:(CloooudNativeAd )nativeAd withView:(UIView _Nullable)view; 广告点击
- (void)nativeAd:(CloooudNativeAd _Nullable)nativeAd dislikeWithReason:(NSArray<CloooudDislikeWords > *_Nullable)filterWords; dislike原因
- (void)nativeAd:(CloooudNativeAd _Nullable)nativeAd adContainerViewDidRemoved:(UIView )adContainerView; 删除广告视图容器 nativeAd:广告材料 adContainerView:广告视图容器 聚合维度不支持场景。
- (void)nativeAdWillPresentFullScreenModal:(CloooudNativeAd *_Nonnull)nativeAd; 广告即将展示全屏页面/商店时触发 nativeAd 广告视图

完整接入示例

- (void)loadNativeAd {
    if (self.adManager) {
        // 销毁上次广告对象 聚合维度方法
        [self.adManager.mediation destory];
    }

    CloooudAdSlot *slot = [[CloooudAdSlot alloc] init];
    slot.ID = @"广告位ID"; // 聚合维度通过广告位ID发起请求,
    slot.adSize = CGSizeMake(375, 150); // 按照实际情况设置广告尺寸

    slot.mediation.mutedIfCan = YES; // 静音 (聚合功能)

    CloooudNativeAdsManager *adManager = [[CloooudNativeAdsManager alloc] initWithSlot:slot];
    adManager.mediation.rootViewController = self;
    adManager.delegate = self;
    self.adManager = adManager;

    [self.adManager loadAdDataWithCount:3]; // 加载广告数量,支持1~3个
}
/******** 信息流广告加载回调处理 *********/
# pragma mark CloooudMNativeAdsManagerDelegate
// 广告加载成功
- (void)nativeAdsManagerSuccessToLoad:(CloooudNativeAdsManager *)adsManager nativeAds:(NSArray<CloooudNativeAd *> *_Nullable)nativeAdDataArray {

    for (CloooudNativeAd *model in nativeAdDataArray) {

        model.rootViewController = self;
        model.delegate = self;
        if (model.mediation.isExpressAd) {
            [model.mediation render];
        } else {
            // 开发者需自行渲染广告,渲染到model.mediation.canvasView上
            // 可以通过model.data.imageMode判断广告样式(大图/视频/组图...)
            // 可以通过model.data.imageAry获取图片数据
            // 可以通过model.data.AdTitle获取广告标题
            // 详情请查看接入文档
            [self customRenderAd:model];


            // 仅接入CSJ广告
            [self.nativeAdRelatedView refreshData:model];
        }

        /*  (注意: getShowEcpmInfo 只需要在当前 adView show 之后调用, show 之前调用该方法会返回 nil)
        CloooudMRitInfo *info = [model.mediation getShowEcpmInfo];
        NSLog(@"ecpm:%@", info.ecpm);
        NSLog(@"platform:%@", info.adnName);
        NSLog(@"ritID:%@", info.slotID);
        NSLog(@"requestID:%@", info.requestID ?: @"None");
        */

        CloooudDictionary *mediaExt = model.mediation.extraData;
        if (mediaExt) {
            NSLog(@"coupon:%@", mediaExt[@"coupon"]);
            NSLog(@"live_room:%@", mediaExt[@"live_room"]);
            NSLog(@"product:%@", mediaExt[@"product"]);
        }

        // 展示广告
        if (model.mediation.canvasView) {
            [self.view addSubview:model.mediation.canvasView];
        }
    }
}

// 广告加载失败
- (void)nativeAdsManager:(CloooudNativeAdsManager *)adsManager didFailWithError:(NSError *_Nullable)error {

}

详细示例请参见Demo